package com.desay.pangoo.itmt.service.impl;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;

import org.apache.commons.collections4.map.HashedMap;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import com.desay.pangoo.itmt.controller.vo.AllTechVo;
import com.desay.pangoo.itmt.controller.vo.MaturityVo;
import com.desay.pangoo.itmt.controller.vo.PriorityVo;
import com.desay.pangoo.itmt.controller.vo.TechOnPlanActivitiesVo;
import com.desay.pangoo.itmt.controller.vo.TechTotalVo;
import com.desay.pangoo.itmt.entity.TechProjectInfoEntity;
import com.desay.pangoo.itmt.repository.TechProjectInfoRepository;
import com.desay.pangoo.itmt.repository.spec.ExpandCriteria;
import com.desay.pangoo.itmt.repository.spec.Restrictions;
import com.desay.pangoo.itmt.service.StatisticsService;

/**
 * @author uidq1163
 */
@Service
public class StatisticsServiceImpl implements StatisticsService {

    @Autowired
    TechProjectInfoRepository techProjectInfoRepository;

    @Override
    public List<PriorityVo> getPrioritiesStatistics() {
        return techProjectInfoRepository.getPrioritiesStatistics();
    }

    @Override
    public List<MaturityVo> getKeyTechMaturityStatistics() {
        return techProjectInfoRepository.getKeyTechMaturityStatistics();
    }

    @Override
    public List<MaturityVo> getCoreTechMaturityStatistics() {
        return techProjectInfoRepository.getCoreTechMaturityStatistics();
    }

    @Override
    public List<TechTotalVo> getTechTotalStatistics() {
        return techProjectInfoRepository.getTechTotalStatistics();
    }

    @Override
    public List<TechOnPlanActivitiesVo> getTechOnPlanActivitiesStatistics() {
        return techProjectInfoRepository.getTechOnPlanActivitiesStatistics();
    }

    @Override
    public List<AllTechVo> getAllTechStatistics() {
        return techProjectInfoRepository.getAllTechStatistics();
    }

    @Override
    public Object getList(Integer startYear, Integer endYear) {
        ExpandCriteria<TechProjectInfoEntity> c = new ExpandCriteria<>();
        // 年
        c.add(Restrictions.gte("techYearQuarters.year", startYear, true));
        // 根据组查询
        c.add(Restrictions.lte("techYearQuarters.year", endYear, true));
        // 技术等级:核心:1，关键:2，通用:3，一般:4
        c.add(Restrictions.in("techLevel", Arrays.asList(1, 2), true));
        // 技术等级不为空
        c.add(Restrictions.isNotNull("maturity"));
        // 可选规划总数、开发中、已交付、计划中的4类数据，时间跨度可调，自动按14个技术域形成柱状图（默认为“开发中”）
        // maturity
        List<TechProjectInfoEntity> list = techProjectInfoRepository.findAll(c);
        // 按照技术状态分类
        Map<String, List<TechProjectInfoEntity>> groupByMaturity = list.stream().collect(Collectors.groupingBy(item -> item.getMaturity()));
        Map<String, Object> results = new HashedMap<>();
        groupByMaturity.keySet().forEach(key -> {
            // 根据技术域分类聚合
            Map<String, Long> result = groupByMaturity.get(key).stream().collect(Collectors.groupingBy(item -> item.getTechClass().getWorkGroup().getWorkGroupName(), Collectors.counting()));
            results.put(key, result);
        });
        return results;
    }

    /***
     * 管理看板【近12个月完成开发的技术数量】，按14个技术域划分，可选时间自动生成，统计存在技术路线“ON”且状态为“RELEASED”的路线数量。
     *
     * @param startYear
     * @param endYear
     * @return
     */
    @Override
    public Object getCompleteTechList(Long workGroupId, String startYear, String endYear) {
        ExpandCriteria<TechProjectInfoEntity> c = new ExpandCriteria<>();
        c.add(Restrictions.eq("techClass.workGroup.id", workGroupId, true));
        // 年
        c.add(Restrictions.gte("techYearQuarters.yearQuarter", startYear, true));
        c.add(Restrictions.lte("techYearQuarters.yearQuarter", endYear, true));
        // 统计存在技术路线“ON”且状态为“RELEASED”
        // 状态：1:plan 2:on
        c.add(Restrictions.eq("techYearQuarters.status", 2, true));
        // 状态为“RELEASED”
        c.add(Restrictions.eq("maturity", "RELEASED", true));
        // 可选规划总数、开发中、已交付、计划中的4类数据，时间跨度可调，自动按14个技术域形成柱状图（默认为“开发中”）
        // maturity
        List<TechProjectInfoEntity> list = techProjectInfoRepository.findAll(c);
        // 根据技术域分类聚合
        return list.stream().collect(Collectors.groupingBy(item -> item.getTechClass().getWorkGroup().getWorkGroupName(), Collectors.counting()));
    }

}
